복붙노트

[SPRING] Spring Security의 username-password grant에서 새로 고침 토큰을 사용하여 새 액세스 토큰 요청 OAuth2

SPRING

Spring Security의 username-password grant에서 새로 고침 토큰을 사용하여 새 액세스 토큰 요청 OAuth2

우리는 인증 서버에서 액세스 토큰을 얻기 위해 username-password 권한을 사용하고 있습니다. 사용자가 로그 아웃하거나 클라이언트 응용 프로그램을 닫을 때까지 제공된 새로 고침 토큰을 사용하여 액세스 토큰이 만료되기 전에 새로 고침하려고합니다.

그러나이 새로 고침 토큰 요청을 발급하는 방법에 대한 예제를 찾을 수 없습니다.

토큰을 얻으려면 다음과 같이 호출합니다.

curl -v --data "grant_type=password&username=user&password=pass&client_id=my_client" http://localhost:8080/oauth/token

새로 고침하려면 다음과 같이 호출해야합니다.

curl -v --data "grant_type=refresh_token&access_token=THE_ACCESS_TOKEN&refresh_token=THE_REFRESH_TOKEN" http://localhost:8080/oauth/token

어쩌면

curl -v -H "Authorization: Bearer THE_ACCESS_TOKEN" --data "grant_type=refresh_token&refresh_token=THE_REFRESH_TOKEN" http://localhost:8080/oauth/token

그러나 그것은 단지 저에게 401을 줄 것입니다 ..

오 그래, 아마도 clientId를 추가해야할까요? 아무 것도 없으므로 클라이언트 보안을 사용할 수 없습니다 (위의 토큰 요청 얻기 참조). 결국 인증은 사용자 이름과 암호를 사용하여 수행됩니다.

우리는 서버 설정이 적절하다고 생각합니다. 그래서 여기에 게시하지 않을 것입니다. 내 예제 요청 중 하나가 작동해야하고 중요한 구성 부분을 볼 필요가 있다면 추가 할 것입니다.

감사!

해결법

  1. ==============================

    1.그래서 내가 말했듯이 우리는 클라이언트 비밀을 사용하지 않습니다. 왜냐하면 우리는 자바 스크립트 클라이언트 응용 프로그램에 그걸 숨길 수 없기 때문입니다. 그리고 어쨌든, username-password 권한을 사용할 때 필요하지 않습니다. (우리가 액세스 토큰을 요구하는 방식을보십시오). 실제로 나는 해결책에 가깝고 마침내 그것을 알아 냈다 :

    그래서 내가 말했듯이 우리는 클라이언트 비밀을 사용하지 않습니다. 왜냐하면 우리는 자바 스크립트 클라이언트 응용 프로그램에 그걸 숨길 수 없기 때문입니다. 그리고 어쨌든, username-password 권한을 사용할 때 필요하지 않습니다. (우리가 액세스 토큰을 요구하는 방식을보십시오). 실제로 나는 해결책에 가깝고 마침내 그것을 알아 냈다 :

    curl -v --data "grant_type=refresh_token&client_id=THE_CLIENT_ID&refresh_token=THE_REFRESH_TOKEN" http://localhost:8080/oauth/token
    

    따라서 액세스 토큰이나 클라이언트 비밀이 필요하지 않습니다.

    전반적으로 그것은 충분히 안전하다고 느낍니다.

  2. ==============================

    2.grant_type 암호의 경우 clientId 및 clientSecret이 필요합니다. 세 번째 시도는 거의 끝났지 만 Authorization 헤더에 Access Token 대신 Base64로 인코딩 된 clientId와 clientSecret을 전달합니다. 올바른 새로 고침 토큰 요청입니다.

    grant_type 암호의 경우 clientId 및 clientSecret이 필요합니다. 세 번째 시도는 거의 끝났지 만 Authorization 헤더에 Access Token 대신 Base64로 인코딩 된 clientId와 clientSecret을 전달합니다. 올바른 새로 고침 토큰 요청입니다.

    curl -H "Authorization: Bearer [base64encode(clientId:clientSecret)]" "https://yourdomain.com/oauth/token?grant_type=refresh_token&refresh_token=[yourRefreshToken]"
    

    좋은 참고 자료를 보려면 다음을 확인하십시오. http://techblog.hybris.com/2012/06/11/oauth2-resource-owner-password-flow/

  3. from https://stackoverflow.com/questions/19655911/request-new-access-token-using-refresh-token-in-username-password-grant-in-sprin by cc-by-sa and MIT license