What is the format of the request for authentication to python-eve api - mongodb

I, basically, have two related questions.
In my case, I have a global Mongo authentication as admin with the password pass. I implemented my BCryptAuth as described in this answer, so I can create users without any authentication like this:
curl -d 'username="barack"' -d 'password="obama"' http://0.0.0.0:5000/users/?pretty
Then, I can access my api using my Mongo authentication like this:
curl -u admin:pass http://0.0.0.0:5000/users/?pretty
But I cannot use any of my new user's credentials to get any data. So, the request
curl -u barack:obama http://0.0.0.0:5000/users/?pretty
does not work. I always get 401:
{
"_status": "ERR",
"_error": {
"code": 401,
"message": "Please provide proper credentials"
}
}
In this example, after implementing basic authentication, the request is the following:
curl -H "Authorization: Basic YWRtaW46c2VjcmV0" -i http://example.com
It is not clear for me what the token after the Basic keyword is. I also tried to use this format in my case, but nothing works.
So, the first question is, what must be the format of the request as the barack user with the password obama for the BasicAuth?
Also, I am trying to implement the TokenAuth. Then the second question is, what is the format of the request with the token?
I could not find any clear information about this.
UPDATE
Thanks to #gcw, I figured out how to make the request using the Authorization header.
Couple of remarks:
The Base64 decoding on linux is done with echo '<base64encodedstring>' | base64 -d. The -D is the macos option.
The Base64 encoding is done with: echo -n '<string>' | base64. The -n is important - it drops the new line character, which is by default included in the <string>.
But I still was not able to use my newly created users to login to the api.

The Authorization header must have the admin:pass information in base64 format. If you check the contents of YWRtaW46c2VjcmV0 by decoding it with echo "YWRtaW46c2VjcmV0" | base64 -D you can see that it is admin:secret. Try to use your credentials in base64 format to see if that works. Also, you can generate the Authorization header using Postman Basic Auth tab.
About using the TokenAuth, you can use Bearer instead of Basic to pass your token in base64 format. This answer here explains some details about different HTTP authentication methods.

Related

Keycloak: cannot get token from a custom spi

I have to create two rest services via keycloak.
The first one sends a verification code to a phone number. The second one grant a token to a user if the verification code is correct for a given phone number.
I have created a module with a custom SPI following the guide in https://github.com/FX-HAO/keycloak-phone-authenticator. The provider can be found. I have also created the Direct grant flow copy and made it the default direct grant flow for the realm.
I can send the verification code with a request to http://{host}//auth/realms/{my_realm}/{my_provider}/send_sms
However, I cannot get the token using the following request:
curl -X POST http://{host}/auth/realms/{my realm}/protocol/openid-connect/token
-H 'authorization: Basic {my keycloak admin username and password}'
-H 'content-type: application/x-www-form-urlencoded' -d 'grant_type=password&phone_number={phone number}&code={code}'
I keep getting the invalid_client_credentials error and it seems that my provider is not called because there is nothing in its logs.
What am I doing wrong?
As #sventorben said, the problem was in specifying wrong credentials for the client

How do I curl against a git.io URL generated from a private repo?

I have a script that I'd like to be able to access via a curl command against its https://raw.githubusercontent.com/... location. Using git.io, it's really easy to shorten this URL to something like https://git.io/ABCDE.
But there's an issue related to the fact that my script exists in a private repository. If I directly curl against the githubusercontent URL, I get 404: Not Found. I'm able to bypass this by passing an authorization header with the request, e.g.
$ curl -H "Authorization: token <My Github Personal Access Token>" \
https://raw.githubusercontent.com/...
> !#/bin/bash
... # rest of script
However, when I use my shortened URL, I don't get anything back. Not even a 404.
$ curl -H "Authorization: token <My Github Personal Access Token>" \
https://git.io/ABCDE
$
Anyone know what's going on here?
The way a URL shortener works is that it issues some sort of 3xx-series HTTP status code that redirects you to the new location, and then you make your request against that new location. However, by default, curl does not follow redirects, so all you see when you make your request is the output from git.io, which in this case is nothing.
If you want to follow redirects, then you should use the -L option to curl, which will make it follow redirects. Note that this can be insecure in many cases when passing credentials, since any credentials passed with -H will be passed to any remote server that the data is redirected to. In this case, that's what you want, but it can be a security problem in other cases if the credentials were only intended for the original server.

Accessing Concourse REST API from resource

I am trying to write a custom Concourse resource (in Python) that accesses the Concourse instance's REST API for information. I'm stuck at obtaining the bearer token at login. The issue is that when I follow the gist of this shell script
#!/bin/bash
## Variables required #need to update these to take inputs for getting token per team and target.
CONCOURSE_URL="http://localhost:8080"
CONCOURSE_USER="test"
CONCOURSE_PASSWORD="test"
CONCOURSE_TEAM="test"
CONCOURSE_TARGET="my-concourse"
function get_token() {
## Create a file named token that will be used to read and write tokens
touch token
## extract the LDAP authentication url and write to token file
LOCAL_AUTH_URL=$CONCOURSE_URL$(curl -b token -c token -L "$CONCOURSE_URL/sky/login" -s | grep "/sky/issuer/auth/local" | awk -F'"' '{print $4}')
echo "url is $LOCAL_AUTH_URL"
# login using username and password while writing to the token file
curl -s -o /dev/null -b token -c token -L --data-urlencode "login=$CONCOURSE_USER" --data-urlencode "password=$CONCOURSE_PASSWORD" "$LOCAL_AUTH_URL"
ATC_BEARER_TOKEN=`grep 'Bearer' token | cut -d\ -f2 | sed 's/"$//'`
echo $ATC_BEARER_TOKEN
}
there are many redirects involved, and at least some of them refer to the concourse instance as being at http://localhost:8080, which does not work from inside the docker container of the resource.
So I wanted to parametrize the external base url and explicitly give it in resource config. Manually handling the redirects and rewriting the local IP into the URL fails at the last "approval" step with a code 400, probably because it looks like some kind of a cross-domain attack.
The environment variable ATC_EXTERNAL_URL is always localhost:8080 and I suspect that this is also used when forming out the redirect urls. Can this be set somewhere?
I'm bad at golang, but it seems to me that https://github.com/concourse/concourse-pipeline-resource calls the fly binary to achieve some kind of login from inside a resource. Can't say I can get what it does and how.
All help appreciated...
The env var $ATC_EXTERNAL_URL most likely corresponds to the external url specified when you start Concourse, so yes, it can (and if you're using external auth like Github or OAuth, must) be changed. You're correct in assuming that it's used to construct callback URLs.
Also, I don't want to be That Guy(TM), but the Concourse REST API is not public and is subject to change at any time. What are you trying to do that you can't get from the fly CLI? Your resource could call the ATC_EXTERNAL_URL to get the fly CLI when it's needed then execute commands that way.

GitHub API Create File Returns 404

This seems to be answered elsewhere but using the same command as other answers I still get a 404.
I'm trying to test creating a file with GitHub's v3 API. Whether I use curl or a rest api tester I get a 404 "not found" error. I believe I am getting properly authorized as I can check my rate count and it is counting down from 5,000 (the rate limit you get when authorized).
I can do a GET like so:
curl -X GET -H "Authorization: token <mytoken>" https://api.github.com/repos/<myorg>/<myrepo>/contents/testfile
My PUT is like so:
curl -X PUT -H "Authorization: token <mytoken>" https://api.github.com/repos/<myorg>/<myrepo>/contents/newfile -d "{'message': 'Initial Commit','content': 'bXkgbmV3IGZpbGUgY29udGVudHM='}"
I've also tried this:
curl -X PUT -H "Authorization: token <mytoken>" https://api.github.com/repos/<myorg>/<myrepo>/contents/test.txt -d "{'path': 'test.txt', 'branch': 'dev', 'message': 'Initial Commit', 'committer': {'name': '<myname>', 'email': '<myemail>'}, 'content': 'bXkgbmV3IGZpbGUgY29udGVudHM='}"
So to recap, GET seems to work. PUT seems to not work. If anyone can help please do. If I get no answer, someone please tell my story.
Turns out, I'm just a moron. I was using the personal access token (PAT) of a user that had read-only access to my repo. Using a PAT of someone that had write access worked just fine. Who knew?
Sorry about that, internet. I'll never doubt you again.
I was creating an API wrapper and my input path had an extra leading "/" I removed the forward slash and no more error 404.
So, look for typos in the request URL, especially if your path constructor places a trailing slash. Good constructors usually take care of this case, but clearly not all.

Github v3 API - create a REPO

I’m trying to use the Github v3 API - I already implemented the required OAuth flow and it works well.
Now I’m trying some of the Repos API endpoints (http://developer.github.com/v3/repos/).
So far, I’m able to get a List of my repos using: GET /user/repos
However, when I try to create a repo using POST /user/repos, I get a 404.
Any thoughts what I might be doing wrong?
Joubert
Can you please tell us how exactly you did the HTTP request? The 404 sounds like you were using a wrong path, probably. But to give a reliable answer instead a wild guess, we need to see your request, including how you are sending your token, just mask it with 'xxx' or something.
I'll show you in the meantime an example request, that is working:
curl -XPOST -H 'Authorization: token S3CR3T' https://api.github.com/user/repos -d '{"name":"my-new-repo","description":"my new repo description"}'
You would need to replace the OAuth token of course: S3CR3T
I had the same issue. The reason why you are getting a 404 with your oauth access token is that when you authorize to github you need to also additionally pass the scopes you want. For example, in the header you should see "X-OAuth-Scopes: repo, user", which means this user has read/write access to his profile and repositories. Once you have set the correct scopes you should be able to do POST/PUT requests just fine.
To see whether or not you have the correct permissions. You can do something like the following. Substitute the XXXXXXX with your access token.
curl -I https://api.github.com/user?access_token=XXXXXXXX
For creating repositories as a user you can use an personal access token and basic auth, which can be much simpler when you are fluffing around on the command line and have 2FA enabled.
curl -d '{"name":"test"}' -u githubuser:personaccesstoken https://api.github.com/user/repos
Create a personal access token here https://github.com/settings/tokens and make sure it has the 'repo' scope.
This script lets you read in in the token and project name as variables so you can use it in a script
#!/usr/bin/env bash -u
#
TOKEN=`cat token_file`
PROJECT=myproject
curl -X POST -H 'Content-Type: application/x-www-form-urlencoded' -d '{"name": "'"$PROJECT"'"}' https://api.github.com/user/repos?access_token=$TOKEN