oauth2在獲取access_token之前,一定要先獲取code,主要是因為安全原因:
- code需要設置過期時間,一般設置的過期時間非常短,如10分鍾等,用戶需要在短時間內通過code換取access_token,避免code被第三方攔截。當然,即便這種情況會發生,但因為code的過期時間非常短,也在一定程度上進行了保護,但這肯定不是完全安全的
- 授權成功后,code是會直接顯示在瀏覽器上的,如果不通過code換取access_token,而是直接返回access_token,那access_token會被暴露出來,而code換取access_token是直接通過oauth服務器進行換取的,不依賴瀏覽器,access_token不會暴露出去。
前提是,你先在oauth服務器上進行了注冊,得到了client_id和app_secret,請求時,不僅需要發送code,還需要發送client_id,oauth服務器會對client_id進行判斷,是否已經進行了注冊
當然,OAuth2還是允許直接返回access_token,而不經過code換取,查看 RFC6749,可以看到,oauth2一共有四種模式:
第一種:
- 首先用戶在客戶端上點擊要用哪個系統的OAuth2來認證,此時客戶端附上回調地址
- 用戶在OAuth2服務器上選擇是否授權用戶給予授權,OAuth2服務器重定向到第一步給定的回調地址,同時附上 Authorization Code,
- 回調地址所在服務器帶上 Authorization Code和client_id,向OAuth2服務器申請 access_token 和 refresh_token,可通過這兩個token去換取資源
- OAuth2服務器返回 access_token 和 refresh_token
第二種:
- 用戶在客戶端上點擊要哪個系統的OAuth2來認證,此時客戶端附上回調地址
- 用戶在OAuth2服務器上選擇是否授權
- 用戶給於授權,OAuth2服務器重定向到第一步給定的回調地址,並且附上 access_token 和 refresh_token
第三種: 用戶直接輸入用戶名和密碼,這種情況針對自家的APP或者100%信任的APP可以這么干
第四種: 客戶端自帶認證,用戶向客戶端認證就可以